package controllers

import (
	"crmObject/models"
	"crmObject/util"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/gomodule/redigo/redis"
	"math/rand"
	"strconv"
	"time"
)

type CustomersController struct {
	beego.Controller
}

var customerss []models.Customers

//客户流失列表展示

func (c *CustomersController) ListRunAwayCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable("customers").Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)
	_, err = newOrm.QueryTable("customers").Filter("drain_cause__ne", "").RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&customerss)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["customer"] = customerss
	c.Data["page"] = pagination
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "losecustomertables.html"
}

//客户流失关键字查询

func (c *CustomersController) SelectRunAwayCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	legalPerson := customers.LegalPerson
	customerName := customers.CustomerName
	newOrm := orm.NewOrm()
	//TODO 需要判断没有查询到结果
	if legalPerson == "" && customerName == "" {
		fmt.Println(err)
		errCode := 505
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	} else if legalPerson != "" {
		if customerName != "" {
			//两个都存在
			all, _ := newOrm.QueryTable(&customers).Filter("drain_cause__ne", "").Filter("legal_person__contains", legalPerson).Filter("customer_name", customerName).RelatedSel().All(&customerss)
			if all == 0 {
				fmt.Println(err)
				errCode := 508
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
		} else {
			//法人有
			all, err1 := newOrm.QueryTable(&customers).Filter("drain_cause__ne", "").Filter("legal_person__contains", legalPerson).RelatedSel().All(&customerss)
			if err != nil {
				fmt.Println(err1)
				errCode := 500
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
			if all == 0 {
				fmt.Println(err1)
				errCode := 508
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}

		}
	} else {
		//客户名称有
		all, _ := newOrm.QueryTable(&customers).Filter("drain_cause__ne", "").Filter("customer_name__contains", customerName).RelatedSel().All(&customerss)
		if all == 0 {
			fmt.Println(err)
			errCode := 508
			newError := util.NewError(errCode)
			c.Data["error"] = newError
			c.TplName = "error.html"
		}
	}
	//虚假数据
	pagination := util.NewPagination(4, 1, util.PAGESIZE)
	c.Data["page"] = pagination
	c.Data["customer"] = customerss
	c.TplName = "customertables.html"
	//这里可以直接返回已经渲染好的页面的代码给ajax的data
}

//--------------------------客户信息管理-------------------------------
//查询客户信息列表

func (c *CustomersController) SelectCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable("customers").Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)
	_, err = newOrm.QueryTable("customers").RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&customerss)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["customer"] = customerss
	c.Data["page"] = pagination
	//userSession := c.GetSession("users")
	//users := userSession.(models.Users)
	//c.Data["user"] = users
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}

	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "customertables.html"
}

//添加客户信息

func (c *CustomersController) AddCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	var customers models.Customers
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)

	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	o := orm.NewOrm()
	//先添加联系人信息
	contacts := *customers.Contacts
	contacts.ContactID = 0
	_, err = o.Insert(&contacts)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//获取contacts外键
	err = o.Read(&contacts, "ContactName")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	customers.Contacts = &contacts
	//客户编码
	// 使用当前时间戳作为随机数种子
	rand.Seed(time.Now().UnixNano())
	// 生成随机数
	randomNumber := strconv.Itoa(rand.Intn(10000)) // 生成0到10000开区间之间的随机数
	//生成纳秒级时间戳
	currentTime := time.Now()
	timestamp := strconv.FormatInt(currentTime.UnixNano(), 10)
	customers.CustomersNum = fmt.Sprintf("%s %s", randomNumber, timestamp)
	//将数据插入客户表中
	_, err = o.Insert(&customers)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//删除客户信息(携带对应的客户信息id)

func (c *CustomersController) DeleteCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//TODO 多次使用把这个提炼出来作为全局
	var customers models.Customers
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	//delete不需要外键会直接删除
	_, err = newOrm.Delete(&customers)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//查询修改的客户信息

func (c *CustomersController) SelectUpdateCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	err = newOrm.QueryTable(&customers).Filter("customer_i_d", customers.CustomerID).RelatedSel().One(&customers)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	c.Data["json"] = map[string]interface{}{
		"CustomerID":       customers.CustomerID,
		"CustomerName":     customers.CustomerName,
		"ContactName":      customers.Contacts.ContactName,
		"ContactInfo":      customers.Contacts.ContactInfo,
		"CustomersAddress": customers.CustomersAddress,
		"CustomerDescribe": customers.CustomerDescribe,
		"LegalPerson":      customers.LegalPerson,
		"CustomerRank":     customers.CustomerRank,
		"DrainCause":       customers.DrainCause,
	}
	c.ServeJSON()

}

//修改客户信息

func (c *CustomersController) UpdateCustomers() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	var customers models.Customers
	var contacts models.Contacts
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//修改了联系人姓名,在customers表中要修改外键值
	contacts.ContactName = customers.Contacts.ContactName
	o := orm.NewOrm()
	err = o.Read(&contacts, "ContactName")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	customers.Contacts = &contacts //这个对象主键有值时,会自动把id作为条件
	_, err = o.Update(&customers, "customer_name", "contacts", "customers_address", "customer_describe", "legal_person", "customer_rank", "drain_cause")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//查看客户历史订单 携带参数客户id

//func (c *CustomersController) SelectCustomersOrders() {
//	// 在进入每个页面之前进行登录状态的判断
//	if !IsUserLoggedIn() {
//		c.Redirect("/login", 302) // 未登录则重定向到登录页面
//	}
//	var salesOrders []models.SalesOrders
//	customersId := c.GetString("customersId")
//	parseInt, err := strconv.ParseInt(customersId, 10, 32)
//	newOrm := orm.NewOrm()
//	_, err = newOrm.QueryTable("salesOrders").Filter("customers", parseInt).RelatedSel().All(&salesOrders)
//	if err != nil {
//		c.Data["json"] = LoginResponse{Success: false, Message: "数据查询失败"}
//		c.ServeJSON()
//		return
//	}
//	c.Data["json"] = LoginResponse{Success: true, Message: "数据查询成功"}
//	c.ServeJSON()
//}

//关键字查询

func (c *CustomersController) KeyWordSelectCustomers() {
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &customers)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	legalPerson := customers.LegalPerson
	customerName := customers.CustomerName
	newOrm := orm.NewOrm()
	//TODO 没有查询到结果
	if legalPerson == "" && customerName == "" {
		fmt.Println(err)
		errCode := 505
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	} else if legalPerson != "" {
		if customerName != "" {
			//两个都存在
			_, err = newOrm.QueryTable(&customers).Filter("legal_person__contains", legalPerson).Filter("customer_name__contains", customerName).RelatedSel().All(&customerss)
		} else {
			//法人有
			_, err = newOrm.QueryTable(&customers).Filter("legal_person__contains", legalPerson).RelatedSel().All(&customerss)
			if err != nil {
				fmt.Println(err)
				errCode := 500
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
		}
	} else {
		//客户名称有
		_, err = newOrm.QueryTable(&customers).Filter("customer_name__contains", customerName).RelatedSel().All(&customerss)
	}
	//虚假数据
	pagination := util.NewPagination(4, 1, util.PAGESIZE)
	c.Data["page"] = pagination

	c.Data["customer"] = customerss
	c.TplName = "customertables.html"
	//这里可以直接返回已经渲染好的页面的代码给ajax的data
}
